# -*- coding: utf-8 -*-

from odoo import models, fields, api


class WechatUser(models.Model):
    _name = 'wechat.user'
    _description = '微信用户'
    _rec_name = 'name'

    name = fields.Char(string='姓名', required=True, index=True)
    phone = fields.Char(string='手机号', index=True)
    email = fields.Char(string='邮箱')
    openid = fields.Char(string='OpenID', required=True, index=True)
    unionid = fields.Char(string='UnionID', index=True)
    avatar_url = fields.Char(string='头像URL')
    gender = fields.Selection([
        ('0', '未知'),
        ('1', '男'),
        ('2', '女')
    ], string='性别', default='0')
    city = fields.Char(string='城市')
    province = fields.Char(string='省份')
    country = fields.Char(string='国家')
    
    # 角色管理
    role = fields.Selection([
        ('user', '普通用户'),
        ('admin', '全局管理员'),
    ], string='角色', default='user', required=True)
    is_active = fields.Boolean(string='是否激活', default=True)
    
    # 管理的活动（作为创建者）
    created_activity_ids = fields.One2many('speech.activity', 'creator_id', string='创建的活动')
    managed_activity_ids = fields.Many2many('speech.activity', 'speech_activity_manager_rel', 
                                            'user_id', 'activity_id', string='管理的活动')
    
    last_login_date = fields.Datetime(string='最后登录时间')
    token = fields.Char(string='访问令牌')
    token_expire_date = fields.Datetime(string='令牌过期时间')
    
    registration_ids = fields.One2many('speech.registration', 'user_id', string='报名记录')
    vote_ids = fields.One2many('speech.vote', 'user_id', string='加油记录')
    
    _sql_constraints = [
        ('openid_unique', 'UNIQUE(openid)', '该微信用户已存在！')
    ]

    def generate_token(self):
        """生成访问令牌"""
        import secrets
        import hashlib
        from datetime import datetime, timedelta
        
        token = hashlib.sha256(
            f"{self.openid}{datetime.now().timestamp()}{secrets.token_hex(16)}".encode()
        ).hexdigest()
        
        self.write({
            'token': token,
            'token_expire_date': fields.Datetime.now() + timedelta(days=30),
            'last_login_date': fields.Datetime.now()
        })
        
        return token

    def check_token(self, token):
        """验证令牌"""
        if not token or token != self.token:
            return False
        
        if not self.token_expire_date or fields.Datetime.now() > self.token_expire_date:
            return False
        
        return True
    
    def is_global_admin(self):
        """是否全局管理员"""
        return self.role == 'admin'
    
    def can_manage_activity(self, activity):
        """是否可以管理某个活动"""
        # 全局管理员可以管理所有活动
        if self.is_global_admin():
            return True
        
        # 活动创建者可以管理自己的活动
        if activity.creator_id.id == self.id:
            return True
        
        # 被指定为活动管理员
        if self in activity.manager_ids:
            return True
        
        return False

